#include<iostream>
#include "mprpcapplication.h"
#include"user.pb.h"
#include"mprpcchannel.h"
#include"mprpccontroller.h"


int main(int argc,char** argv){

    //整个程序启动以后，想使用mprpc框架来享受rpc服务调用，一定需要先调用框架的初始化函数(只初始化一次就行)
    MprpcApplication::Init(argc,argv);

    //演示调用远程发布的rpc方法Login
    /*
        UserServicesRpc_Stub对象的初始化都是使用一个channel初始化
        执行·UserServicesRpc_Stub调用方法时，底层是调用channel->RpcChannel::CallMethod
        所以我们可以在CallMethod设置的回调那里来做调用参数的序列化和网络发送
    */
    fixbug::UserServiceRpc_Stub  stub(new MprpcChannel());

    //按照user.proto文件定义的请求格式封装
    //rpc方法的请求参数
    fixbug::LoginRequest request;
    request.set_name("zhang san");
    request.set_pwd("123456");
    //rpc方法的响应 
    fixbug::LoginResponse response;
    //发起rpc方法的调用
    /*
    
    下面方法的第一参数信息
        google::protobuf::RpcController *controller
        这个参数存储一些控制信息，让我们清楚的知道当前调用的rpc状态
        （不然你调用了下面Login方法，里面到底执行成功了还是失败了都不知道）
        controller可以携带运行过程中的一些状态信息，（失败与否，失败了以后错误信息是什么）
    
    */
    MprpcController rpccontroller;
    stub.Login(&rpccontroller,&request,&response,nullptr);

    //一次rpc调用完成，读调用的结果
    //确保没出错
    if(!rpccontroller.Failed()){
        if(response.result().errcode()==0){ //0是没错误(调用没失败)
            std::cout<<"rpc login response success: "<<response.sucess()<<std::endl;
        }
         else{
            std::cout<<"rpc login response error: "<<response.result().errmsg()<<std::endl;
        }
    }
    else{
        //打印出错信息
        std::cout<<rpccontroller.ErrorText()<<std::endl;
    }

    return 0;
 
}